package com.dtx.interpreter;

/**
 * 我们来看看迷你语言的语法描述(BNF)来看看各个类的定义。首先,我们看看表示程序<program>的ProgramNode类。
 * 在ProgramNode类中定义了一个Node类型的CommandListNode字段,该字段用于保存<command list>对应的结构(节点)。
 * 那么,ProgramNode的parse方法究竟进行了什么处理?通过查看迷你语言的BNF描述我们可以发现,<program>的定义中最开始
 * 会出现program这个单词。因此,我们用下面的语句跳过这个单词。
 *
 *      context.skipToken("program");
 *
 * 我们称语法解析时的处理单位为标记(token)。在迷你语言中,"标记"相当于"英文单词"。在一般的编程语言中,"+"和"=="等也是标记。
 * 更具体来说,词法分析(lex)是从文字中得到标记,而语言解析(parse)则是根据标记推导出语法树。
 * 上面的skipToken方法可以跳过program这个标记。如果没有这个标记就会抛出ParseException异常。
 * 继续查看BNF描述会发现,在program后面会跟着<command list>。这里,我们会生成<command list>对应的CommandListNode类的实例,
 * 然后会调用该实例的parse方法。请注意,ProgramNode类的方法并不知道<command list>的内容。即在ProgramNode类中实现的内容,
 * 并没有超出下面的BNF所描述的范围。
 *
 *      <program> ::= program <command list>
 *
 * toString方法用于生成表示该节点的字符串。在Java中,连接实例与字符串时会自动调用实例的toString方法,因此如下(1)与(2)是等价的。
 *
 *      "[program " + commandListNode + "]";            ......(1)
 *      "[program " + commandListNode.toString() + "]"; ......(2)
 *
 * 请注意,toString方法的实现也与上面的BNF描述完全相符。
 *
 * //<program> ::= program <command list>
 */
public class ProgramNode extends Node{

    private Node commandListNode;

    @Override
    public void parse(Context context) throws ParseException {
        context.skipToken("program");
        commandListNode = new CommandListNode();
        commandListNode.parse(context);
    }

    @Override
    public String toString() {
        return "[program " + commandListNode + "]";
    }
}
